/**
 * Copyright(c) 2014 Xunton Solutions
 *
 * History:
 *   15-12-15 下午1:39 Created by dwzhang
 */
package com.jade.bss.ec.ware;

import java.util.List;

import com.jade.bss.base.brand.Brand;
import com.jade.bss.base.category.Category;
import com.jade.framework.base.criterion.Criteria;
import com.jade.framework.base.util.PagingList;

/**
 * 商品管理器。
 *
 * @author <a href="mailto:dwzhang@xunton.com">dwzhang</a> 
 * @version 1.0 15-12-15 下午1:39
 */
public interface WareManager
{
    /**
     * 创建商品。
     *
     * @param ware 商品
     * @throws WareException 处理异常
     */
    public void createWare(Ware ware)
            throws WareException;

    /**
     * 更新商品信息。
     *
     * @param ware 商品
     * @throws WareException 处理异常
     */
    public void updateWare(Ware ware)
            throws WareException;

    /**
     * 商品上架。
     *
     * @param wareIds 商品标识
     * @throws WareException
     */
    public void putOnWare(long... wareIds)
            throws WareException;

    /**
     * 商品下架。
     *
     * @param wareIds 商品标识
     * @throws WareException
     */
    public void pullOffWare(long... wareIds)
            throws WareException;

    /**
     * 删除商品。
     *
     * @param ids 商品标识
     * @throws WareException 处理异常
     */
    public void removeWare(long... ids)
            throws WareException;

    /**
     * 更新商品库存，仅针对不使用SKU的情况。
     *
     * @param wareId 商品标识
     * @param quantity 库存数量
     * @throws WareException 处理异常
     */
    public void updateWareStock(long wareId, long quantity)
            throws WareException;

    /**
     * 获取商品信息。
     *
     * @param id 商品标识
     * @return 商品
     * @throws WareException 处理异常
     */
    public Ware getWare(long id)
            throws WareException;

    /**
     * 根据条件列出一个分类下面的所有商品。
     *
     * @param criteria 检索条件
     * @return 商品列表
     */
    public List<Ware> listWare(Criteria criteria);

    /**
     * 根据条件分页列出一个分类下面的所有商品。
     *
     * @param criteria 检索条件
     * @return 商品列表
     */
    public PagingList<Ware> queryWare(Criteria criteria);

    /**
     * 添加商品SKU信息。
     *
     * @param sku 商品SKU
     * @throws WareException 处理异常
     */
    public void addSku(WareSku sku)
            throws WareException;

    /**
     * 修改商品SKU信息。
     *
     * @param sku 商品SKU
     * @throws WareException 处理异常
     */
    public void updateSku(WareSku sku)
            throws WareException;

    /**
     * 添加商品SKU信息。
     *
     * @param skuId 商品SKU标识
     * @param quantity 库存数量
     * @throws WareException 处理异常
     */
    public void updateSkuStock(long skuId, long quantity)
            throws WareException;

    /**
     * 删除商品SKU信息。
     *
     * @param ids 商品SKU标识
     * @throws WareException 处理异常
     */
    public void removeSku(long... ids)
            throws WareException;

    /**
     * 根据标识获取SKU信息。
     *
     * @param id SKU编号
     * @return SKU信息
     */
    public WareSku getSku(long id);

    /**
     * 根据规格信息获取SKU。
     *
     * @param wareId 商品标识
     * @param colorSpec 颜色规格
     * @param sizeSpec 尺码规格
     * @param otherSpec 其他规格
     * @return SKU信息
     */
    public WareSku getSku(long wareId, long colorSpec, long sizeSpec, long otherSpec);

    /**
     * 列出一个商品的所有SKU信息。
     *
     * @param wareId 商品标识
     * @return SKU列表
     */
    public List<WareSku> listSku(long wareId);

    /**
     * 根据条件查询SKU信息。
     *
     * @param criteria 查询条件
     * @return SKU列表
     */
    public PagingList<WareSku> querySku(Criteria criteria);


    /**
     * 根据商品查询条件获取涉及的品牌。
     *
     * @param criteria 查询条件
     * @return 品牌列表
     */
    public List<Brand> searchBrand(Criteria criteria);


    /**
     * 根据商品查询条件获取涉及的分类。
     *
     * @param criteria 查询条件
     * @return 分类列表
     */
    public List<Category> searchCategory(Criteria criteria);
}
